#pragma once
#include <string>
#include <cstddef>
#include <boost/date_time/posix_time/posix_time.hpp>
#include <odb/core.hxx>
#include <odb/nullable.hxx>

namespace wufan_im{
typedef boost::posix_time::ptime ptime;
#pragma db object table("User")   // table:指定表名称, 缺省类名
class User{
public:
    User(){}
    // 通过用户名新增用户 -- 用户ID, 昵称, 密码
    User(const std::string& uid, const std::string& nickname, const std::string& password)
    :_user_id(uid), _nickname(nickname), _password(password)
    {}
    // 通过手机号新增用户 -- 用户ID, 电话, 随机昵称
    User(const std::string& uid, const std::string& phone)
    :_user_id(uid), _nickname(uid), _phone(phone)
    {}

    void user_id(const std::string& val) {_user_id = val; }
    std::string user_id(){ return _user_id; }

    std::string nickname(){ return _nickname; }
    void nickname(const std::string& val){ _nickname = val; }

    std::string description() { return _description; }
    void description(const std::string& val) { _description = val; }

    std::string password() { return _password; }
    void password(const std::string& val) { _password = val; }

    std::string phone() { return _phone; }
    void phone(const std::string& val) { _phone = val; }

    std::string avatar_id() { return _avatar_id; }
    void avatar_id(const std::string& val) { _avatar_id = val; }
private:
    //将 odb::access 类作为 person 类的朋友。
    //这是使数据库支持代码可访问默认构造函数和数据成员所必需的。
    //如果类具有公共默认构造函数和公共数据成员或数据成员的公共访问器和修饰符，则不需要友元声明
    friend class odb::access;
    #pragma db id auto
    unsigned long _id;          // 构建这个表的ID, 自动生成 - 为什么不讲主键ID作为用户ID? 进行用户删除的时候可能出现问题, 而且这样也不易于理解
    #pragma db index type("varchar(64)") unique            // 有索引则代表以后会拿这个字段进行索引
    std::string _user_id;       // 用户ID, 用户唯一标识
    #pragma db index type("varchar(64)") unique
    std::string _nickname;      // 用户昵称 - 不一定存在 - 不存在系统会自动给我们默认初始值
    std::string _description;   // 用户签名 - 不一定存在
    #pragma db type("varchar(64)")
    std::string _password;      // 用户密码 - 不一定存在
    #pragma db index type("varchar(64)") unique
    std::string _phone;         // 用户手机号 - 不一定存在
    #pragma db type("varchar(64)")
    std::string _avatar_id;     // 用户头像文件ID - 不一定存在
};
}

//odb -d mysql --generate-query --generate-schema --profile boost/date-time ../../odb/user.hxx